package com.wypiwyl.footastic;

import com.wypiwyl.footastic.model.Util;
import com.wypiwyl.footastic.view.Flags;
import com.wypiwyl.footastic.view.GrassView;

import android.app.Activity;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
import android.widget.Button;

public class GameActivity extends Activity implements OnGestureListener, OnDoubleTapListener {

    // declaration log
    private static final String TAG = "GameActivity";

    // initialisation des calques
    private static final int INIT_X = 0;
    private static final int INIT_Y = 0;

    // declaration du calque de la pelouse
    private GrassView mGrassView;

    private GestureDetector gestureDetector;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, this.getClass().getName() + ".onCreate" + " - BEGIN");

        // par defaut on prend le calque du jeu
        setContentView(R.layout.game);

        // initialisation du detecteur d'evenements
        gestureDetector = new GestureDetector(this);

        mGrassView = (GrassView) findViewById(R.id.GrassView);
//        mGrassView = new GrassView(this, attrs);
//        setContentView(mGrassView);
//        mGrassView.requestFocus();

        // declaration du bouton pour avancer dans le round
        final Button buttonPlayRound = (Button) findViewById(R.id.gb_playround);
        buttonPlayRound.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 
                checkRound();
                // on rafraichit le canevas
                mGrassView.refreshCanvas();
            }
        });

        // declaration du bouton de selection du ballon
        final Button buttonSelectBall = (Button) findViewById(R.id.gb_selectball);
        buttonSelectBall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // on regarde si le ballon peut etre selectionne
                checkSelectPass();
                // on rafraichit le canevas
                mGrassView.refreshCanvas();
            }
        });

        // declaration du bouton pour recommencer la partie
        final Button buttonRestart = (Button) findViewById(R.id.gb_restart);
        buttonRestart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 
                Arena.getInstance().initGame();
                //
                mGrassView.initGame();
                // on rafraichit le canevas
                mGrassView.refreshCanvas();
            }
        });

        Log.i(TAG, this.getClass().getName() + ".onCreate" + " - END");
    }

    public void checkRound() {

        Log.v(TAG, ".checkRound" + " - BEGIN");

        Flags.getInstance().unselectPass();
        
        switch (Arena.getInstance().getStep()) {
            case TEAMA:
                Arena.getInstance().goStepForward();
            break;
            case TEAMB:
                Arena.getInstance().goStepForward();
            break;
            case NOTEAM:

                if (mGrassView.getmPass() != null) {
                    
                    // calcul de la position de la balle
                    Point positionReelle = Util.getPositionPasse(Arena.getInstance().getPositionBall(), mGrassView.getmPass());
                    //
                    Arena.getInstance().setPositionBall(positionReelle);
                    Flags.getInstance().setPasseDone(true);
                    // deselection du proprietaire du ballon
                    Arena.getInstance().setOwnerBall(null);
                }
                
                
                Arena.getInstance().playRound(mGrassView);

                mGrassView.initRound();
                //
//                Flags.getInstance().initRound();
                
                
            break;
        }
        
        
        
        
        
        
        
//        // on verifie si c'est au tour de l'equipe A
//        if (Flags.getInstance().isTeamATurn()) {
//            //
//            Flags.getInstance().endRoundTeamA();
//        }
//        // on verifie si c'est au tour de l'equipe B
//        else if (Flags.getInstance().isTeamBTurn()) {
//            //
//            Flags.getInstance().endRoundTeamB();
//            
//            
//            if (mGrassView.getmPass() != null) {
//                
//                // calcul de la position de la balle
//                Point positionReelle = Util.getPositionPasse(Arena.getInstance().getPositionBall(), mGrassView.getmPass());
//                //
//                Arena.getInstance().setPositionBall(positionReelle);
//                Flags.getInstance().setPasseDone(true);
//                // deselection du proprietaire du ballon
//                Arena.getInstance().setOwnerBall(null);
//            }
//            
////          // on calcule le delta des ordonnes des points
////          int deltaX = Util.getDeltaX(Arena.getInstance().getPositionBall(), positionReelle);
////          // on calcule le delta des abcisses des points
////          int deltaY = Util.getDeltaY(Arena.getInstance().getPositionBall(), positionReelle);
////          // on recupere le maximum de ces 2 delta
////          int deltaMax = Math.max(Math.abs(deltaX), Math.abs(deltaY));
////          // on en deduit le nombre de sequence
////          int nbSequence = deltaMax / 10;
//        }
//        //
//        else {
//            //
//            Arena.getInstance().playRound(mGrassView);
//
//            mGrassView.initRound();
//            //
//            Flags.getInstance().initRound();
//        }

        Log.v(TAG, ".checkRound" + " - END");
    }

    public void checkSelectPass() {

        Log.v(TAG, ".checkSelectBall" + " - BEGIN");

        // on verifie que le ballon est bien attribue a un joueur
        if (Arena.getInstance().isOwnerBall()) {
            // on verifie si c'est au tour de l'equipe A avec un joueur de l'equipe ou le me cas pour l'equipe B
            if ((Arena.getInstance().isTeamAStep() && Arena.getInstance().getOwnerBall().isbTeamA()) || (Arena.getInstance().isTeamBStep() && !Arena.getInstance().getOwnerBall().isbTeamA())) {
                // on verifie si la passe est deja selectionnee ou pas
                if (Flags.getInstance().isPassSelected()) {
                    // on deselectionne la passe
                    Flags.getInstance().unselectPass();
                } else {
                    // on selectionne la passe
                    Flags.getInstance().selectPass();
                }
            }
        }

        Log.v(TAG, ".checkSelectBall" + " - END");
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mGrassView.doJobDown(event);
            break;
            case MotionEvent.ACTION_MOVE:
                mGrassView.doMove(event);
            break;
            case MotionEvent.ACTION_UP:
                mGrassView.doJobUp(event);
            break;
        }

        boolean onTouchEvent = gestureDetector.onTouchEvent(event);

        //        mGrassView.invalidate();

        Log.d(TAG, ".onTouchEvent" + " - END");

        return onTouchEvent;
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.v(TAG, ".onDoubleTap" + " - BEGIN");

        // 
        // on ne fait plus rien pour l'instant
        //        checkRound();

        Log.v(TAG, ".onDoubleTap" + " - END");
        return false;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        Log.v(TAG, ".onDoubleTapEvent" + " - BEGIN");
        Log.v(TAG, ".onDoubleTapEvent" + " - END");
        return false;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        Log.v(TAG, ".onSingleTapConfirmed" + " - BEGIN");
        Log.v(TAG, ".onSingleTapConfirmed" + " - END");
        return false;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        Log.v(TAG, ".onDown" + " - BEGIN");

        //
        mGrassView.doJobDown(e);

        Log.v(TAG, ".onDown" + " - END");
        return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        Log.v(TAG, ".onFling" + " - BEGIN");
        Log.v(TAG, ".onFling" + " - END");
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        Log.v(TAG, ".onLongPress" + " - BEGIN");
        Log.v(TAG, ".onLongPress" + " - END");
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        Log.v(TAG, ".onScroll" + " - BEGIN");
        
        
        
        
        Log.v(TAG, ".onScroll" + " - END");
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        Log.v(TAG, ".onShowPress" + " - BEGIN");
        Log.v(TAG, ".onShowPress" + " - END");
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        Log.v(TAG, ".onSingleTapUp" + " - BEGIN");
        //        if (grassLayer.isInside(pointEvent)) {
        //            grassLayer.doJobUp(new Point((int) e.getX(), (int) e.getY()));

        mGrassView.doJobUp(e);

        //        }      

        Log.v(TAG, ".onSingleTapUp" + " - END");
        return false;
    }
}